package com.nyist.lockCase;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 1.
 *  * 导致锁不到同一个对象, 出现锁失效的情况
 *  * static 关键字的作用是, 在类初始化的过程中, 只加载一次, 有且仅有一次, 保证了每次创建都是同一个对象
 *  *
 * 2. 在执行锁的过程中, 如果程序走到了, else 中直接进行了 break 跳出循环, 那么就不会执行锁释放的操作
 * 导致程序一直处于待运行状态, 不会停止, 所以 在使用 lock 的时候需要 try/catch/finally 在finally 中执行释放锁的操作
 *
 * @ClassName HelloWorld
 * @Description
 * @Author xiaoyang
 * @Date 2023/04/08/17:51
 */
public class CreateNewObjectEveryTimeAndLockInvalid extends Thread {

    // Create a new object every time and the lock becomes invalid

    // static final Object lockObj = new Object();

    // Lock lock = new ReentrantLock();
    static final Lock lock = new ReentrantLock();
    private static int ticket = 100;

    public static void main(String[] args) {
        CreateNewObjectEveryTimeAndLockInvalid t1 = new CreateNewObjectEveryTimeAndLockInvalid();
        CreateNewObjectEveryTimeAndLockInvalid t2 = new CreateNewObjectEveryTimeAndLockInvalid();
        CreateNewObjectEveryTimeAndLockInvalid t3 = new CreateNewObjectEveryTimeAndLockInvalid();

        t1.setName("first 1111");
        t2.setName("second 2222");
        t3.setName("third 3333");

        t1.start();
        t2.start();
        t3.start();
    }

    @Override
    public void run() {
        while (true) {
            lock.lock();// 获取锁始终在前面, 释放锁的位置改为了, 在finally 中, try/catch/finally 的特点是, 所有try/catch中的代码执行完毕以后, 一定会执行finally的代码
            try {
                Thread.sleep(10);
                if (ticket > 0) {
                    System.out.println("=====>>>currentThread: " + Thread.currentThread().getName() + " ing,by sell " + ticket + " ticket , and random: ");
                    ticket--;
                } else {
                    break;
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
            // lock.unlock();
        }

    }
}
